#include "TimeRange.h"

#include <Arduino.h>

// 根据字符串解析, 格式:183030 代表:18:30:30
TimeRange::Time TimeRange::Time::formString(String value) {
    return {(int)value.substring(0, 2).toInt(),
            (int)value.substring(2, 4).toInt(),
            (int)value.substring(4, 6).toInt()};
}

// 转为字符串
String TimeRange::Time::toString() const {
    char buf[7];
    snprintf(buf, sizeof(buf), "%02d%02d%02d", hour, minute, second);
    return buf;
}

// 构造函数，初始化时间范围
TimeRange::TimeRange(Time start, Time end) : start_(start), end_(end) {
    updateInternalSeconds();  // 初始化时更新秒数表示
}

// 更新时段
void TimeRange::updateTimeRange(Time start, Time end) {
    start_ = start;
    end_ = end;
    updateInternalSeconds();  // 更新秒数表示
}

// 获取开始时间
TimeRange::Time TimeRange::getStart() const { return start_; }

// 获取结束时间
TimeRange::Time TimeRange::getEnd() const { return end_; }

// 判断当前时间是否在范围内
bool TimeRange::isWithinRange(int currentHour, int currentMinute,
                              int currentSecond) const {
    int currentTimeInSeconds =
        toSeconds(currentHour, currentMinute, currentSecond);
    return (currentTimeInSeconds >= startTimeInSeconds_) &&
           (currentTimeInSeconds <= endTimeInSeconds_);
}

// 将时间转换为秒的辅助函数
int TimeRange::toSeconds(int hour, int minute, int second) {
    return hour * 3600 + minute * 60 + second;
}

// 更新内部秒数表示
void TimeRange::updateInternalSeconds() {
    startTimeInSeconds_ = toSeconds(start_.hour, start_.minute, start_.second);
    endTimeInSeconds_ = toSeconds(end_.hour, end_.minute, end_.second);

    // 处理跨午夜的情况
    if (endTimeInSeconds_ < startTimeInSeconds_) {
        endTimeInSeconds_ += 86400;  // 加上一天的秒数
    }
}